﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;  //串口调试用
using System.Threading; //线程

namespace FHtool
{
    public partial class SerialConfigForm : Form
    {
        #region 全局参数
        public static bool formIsOpen = false; //窗口打开标志，禁止窗口重复打开
        private SerialPort serialPort = new SerialPort();
        #endregion

        public SerialConfigForm()
        {
            InitializeComponent();//窗口初始化
            CheckForIllegalCrossThreadCalls = false; //屏蔽多线程调用同一控件时出现的异常
        }

        public SerialConfigForm(SerialPort sp) : this()
        {
            serialPort = sp;
        }

        private void SerialConfig_Load(object sender, EventArgs e)
        {
            formIsOpen = true;

            // 端口名称列表框
            string[] ports = SerialPort.GetPortNames(); //检索当前的计算机的有效端口
            Array.Sort(ports);  //数组排序
            cbPortName.Items.AddRange(ports);//将数组添加到combox列表
            cbPortName.SelectedIndex = cbPortName.Items.Count > 0 ? 0 : -1;

            // 列出常用波特率,根据需求添加
            cbBaudRate.Items.Add("1200");
            cbBaudRate.Items.Add("2400");
            cbBaudRate.Items.Add("4800");
            cbBaudRate.Items.Add("9600");
            cbBaudRate.Items.Add("19200");
            cbBaudRate.Items.Add("38400");
            cbBaudRate.Items.Add("57600");
            cbBaudRate.Items.Add("115200");
            cbBaudRate.Items.Add("230400");
            cbBaudRate.SelectedIndex = 3;   //默认使用9600

            // 列出数据位
            cbDataBits.Items.Add("8");
            cbDataBits.Items.Add("7");
            cbDataBits.Items.Add("6");
            cbDataBits.Items.Add("5");
            cbDataBits.SelectedIndex = 0;   //默认使用8数据位

            // 列出停止位
            cbStopBits.Items.Add("0");
            cbStopBits.Items.Add("1");
            cbStopBits.Items.Add("1.5");
            cbStopBits.Items.Add("2");
            cbStopBits.SelectedIndex = 1;   //默认使用1个停止位

            // 列出奇偶校验位
            cbParity.Items.Add("无");
            cbParity.Items.Add("奇校验");
            cbParity.Items.Add("偶校验");
            cbParity.SelectedIndex = 0;     //默认无校验
        }

        #region 串口端口检测，刷新端口列表
        private void btnSerialFresh_Click(object sender, EventArgs e)
        {
            bool comExist = false; //有可用串口标志位
            cbPortName.Items.Clear(); //清除当前串口号中的所有串口名称
            for (int i = 0; i < 50; i++)//扫描可用串口，串口支持数量根据自己需求更改
            {
                try
                {
                    SerialPort sp = new SerialPort("COM" + (i + 1).ToString());
                    sp.Open();
                    sp.Close();
                    sp.Dispose();
                    cbPortName.Items.Add("COM" + (i + 1).ToString());
                    comExist = true;
                }
                catch (Exception)
                {
                    continue;
                }
            }
            if (comExist)
            {
                cbPortName.SelectedIndex = 0;
            }
            else
            {
                MessageBox.Show("没有找到可用串口！", "错误提示");
            }
        }
        #endregion

        #region 设置串口的属性SetPortProperty
        private void SetPortProperty(ref SerialPort sp)//设置串口的属性
        {
            if (!sp.IsOpen)
            {
                sp.PortName = cbPortName.Text.Trim(); //设置串口名
            }
            sp.BaudRate = Convert.ToInt32(cbBaudRate.Text.Trim());//设置串口波特率
            sp.DataBits = Convert.ToInt16(cbDataBits.Text.Trim());//设置数据位

            float f = Convert.ToSingle(cbStopBits.Text.Trim());//设置停止位
            if (f == 0)
            {
                sp.StopBits = StopBits.None;
            }
            else if (f == 1.5)
            {
                sp.StopBits = StopBits.OnePointFive;
            }
            else if (f == 1)
            {
                sp.StopBits = StopBits.One;
            }
            else if (f == 2)
            {
                sp.StopBits = StopBits.Two;
            }
            else
            {
                sp.StopBits = StopBits.One;
            }
            
            string s = cbParity.Text.Trim();//设置奇偶校验位
            if (s.CompareTo("无") == 0)
            {
                sp.Parity = Parity.None;
            }
            else if (s.CompareTo("奇校验") == 0)
            {
                sp.Parity = Parity.Odd;
            }
            else if (s.CompareTo("偶校验") == 0)
            {
                sp.Parity = Parity.Even;
            }
            else
            {
                sp.Parity = Parity.None;
            }

        }
        #endregion

        #region 串口打开
        private void btnSerialConfig_Click(object sender, EventArgs e)
        {
            SetPortProperty(ref serialPort);
            this.Close();
        }
        #endregion

        private void SerialConfigForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            formIsOpen = false;
        }
    }
}
